package com.shy.util;

import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.json.JSONUtil;
import com.shy.api.model.query.MerchTradeQuery;

import java.util.Map;
import java.util.TreeMap;

public class SignUtil {
    //验证签名，接收请求参数，按签名逻辑生成新签名 和 请求中的sign参数比较
    public static boolean checkSign(MerchTradeQuery merchTradeQuery, String appSecret) {
        //将MerchTradeQuery-->json-->map(TreeMap)
        Map bean = JSONUtil.toBean(JSONUtil.toJsonStr(merchTradeQuery), Map.class);
        //删除sign字段
        bean.remove("sign");
        //重新生成签名
        TreeMap treeMap = new TreeMap(bean);
        StringBuilder builder = new StringBuilder();
        treeMap.forEach((name, val)->{
            builder.append(name).append("=").append(val).append("&");
        });
        builder.append("appSecret=").append(appSecret);
        //计算MD5签名
        String md5 = DigestUtil.md5Hex(builder.toString());
        return md5.equals(merchTradeQuery.getSign());
    }
    //生成签名
    public static String createSign(Map<String,String> params,String appSecret){
        //去掉sign参数， 不参与签名生成的
        params.remove("sign");
        //重新生成签名
        TreeMap treeMap = new TreeMap(params);

        //签名字符串， 所有参数按字典排序后 将非空参数连接为 参数1=值1&参数2=值2....最
        // 后连接"&appSecret=分配的密钥"， 将支付串使用md5处理后， 就是sign值
        StringBuilder builder = new StringBuilder();
        treeMap.forEach( (name,val)->{
            builder.append(name).append("=").append(val).append("&");
        });
        builder.append("appSecret=").append(appSecret);

        //计算MD5
        String md5 = DigestUtil.md5Hex(builder.toString());

        return md5;
    }
}
